package com.guanzhi.creation.singleton;

import java.io.Serializable;

/**
 * 设计模式
 * <p> Package: com.guanzhi.creation.singleton </p>
 * <p> File: ResolveSingleton.java </p>
 * <p> Description:  (创建型模式-单例模式-懒汉式-破坏单例模式情况-序列化)</p>
 * <p> Date: 2024/4/12 0:32</p>
 *
 * @author 观之
 * @version 1.0 （代码版本）
 * @email <a href="mailto:guanzhi55634@aliyun.com">观之</a>（邮箱）
 * @date 2024/4/12 0:32
 * @since jdk17（jdk版本）
 */
public class ResolveSingleton implements Serializable {
    /**
     * 1。静态私有变量
     */
    private static ResolveSingleton resolveSingleton;

    /**
     * 2.私有构造函数
     * 私有构造函数，防止外部通过new EagerSingleton()来创建实例
     */
    private ResolveSingleton() {
        //4.阻止反射重新创建示例的方式
        if (resolveSingleton != null) {
            throw new RuntimeException("单例模式不允许多个实例");
        }
    }

    /**
     * 5.防止序列化破坏单例模式
     * readResolve()实现该方法即可阻止序列号破坏单例
     */
    public Object readResolve() {
        return resolveSingleton;
    }

    /**
     * 3.提供全局访问点来获取该实例
     */
    public static ResolveSingleton getInstance() {
        // 1.第一次调用时，初始化实例
        // 在多线程的访问下可能会创建多个实例,会导致线程及其不安全,需要引入双重检查锁用来保证线程安全。
        // 同时引入双重检查锁会降低性能。
        if (resolveSingleton == null) {
            resolveSingleton = new ResolveSingleton();
        }
        return resolveSingleton;
    }
}
